home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1992 / 09 / 2 / window-machine / wm_source.ampk / WM_Border.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  10.4 KB  |  591 lines

  1. #include <WM.h>
  2. #include <MyStructs.h>
  3. #include <Border.h>
  4.  
  5. extern SHORT gwidth,gheight;
  6. extern ULONG gflags;
  7.  
  8. VOID SetBDefines()
  9. {
  10.     bleft=abor->LeftEdge;
  11.     btop=abor->TopEdge;
  12.     bwidth=abor->Width;
  13.     bheight=abor->Height;
  14.     bfront=abor->FrontPen;
  15.     bback=abor->BackPen;
  16.     bdraw=abor->DrawMode;
  17.     bcount=abor->Count*2;
  18.     for(i=0; i<20; i++)
  19.         helpV[i]=abor->Vectors[i];
  20.     OldVectors();
  21. }
  22. VOID BDef()
  23. {
  24.     sprintf(LEFTBuff,"%d",bleft);
  25.     sprintf(TOPBuff,"%d",btop);
  26.     sprintf(WIDTHBuff,"%d",bwidth);
  27.     sprintf(HEIGHTBuff,"%d",bheight);
  28.     sprintf(FRONTBuff,"%d",bfront);
  29.     sprintf(BACKBuff,"%d",bback);
  30.     if(bdraw==4) bdraw--;
  31.     BText[0].IText=TDMode[bdraw];
  32.     BText[6].IText=GTexte[3];
  33.     if(gborder==0) BText[6].IText=GTexte[2];
  34.     sprintf(GTexte[0],"%0.2d",bnr);
  35.     sprintf(GTexte[1],"%0.2d",bcount);
  36.     for(i=0; i<20; i++)
  37.     {
  38.         if(i<bcount) sprintf(VBuffer[i],"%d",helpV[i]);
  39.         else strcpy(VBuffer[i],"");
  40.     }
  41.     RefreshGadgets(&BAus,Gwin,NULL);
  42. }
  43. USHORT NewBorder()
  44. {
  45.     if(!(abor=(struct MyBorder *)AllocMem(sizeof(struct MyBorder),
  46.         MEMF_CLEAR|MEMF_PUBLIC))) return(1);
  47.     if(BType==0)
  48.     {
  49.         if(agad->GadgetBorder==NULL)
  50.         {
  51.             firstGB=abor;
  52.             agad->GadgetBorder=firstGB;
  53.         }
  54.         else lastGB->NextBorder=abor;
  55.         abor->Parent=lastGB;
  56.         lastGB=abor;
  57.     }
  58.     if(BType==1)
  59.     {
  60.         if(agad->SelectBorder==NULL)
  61.         {
  62.             firstSB=abor;
  63.             agad->SelectBorder=firstSB;
  64.         }
  65.         else lastSB->NextBorder=abor;
  66.         abor->Parent=lastSB;
  67.         lastSB=abor;
  68.     }
  69.     if(BType==2)
  70.     {
  71.         if(areq->ReqBorder==NULL)
  72.         {
  73.             firstGB=abor;
  74.             areq->ReqBorder=firstGB;
  75.         }
  76.         else lastGB->NextBorder=abor;
  77.         abor->Parent=lastGB;
  78.         lastGB=abor;
  79.     }
  80.     abor->LeftEdge=-1;
  81.     abor->TopEdge=-1;
  82.     abor->FrontPen=3;
  83.     if(areq) abor->FrontPen=areq->BackFill ^ 2;
  84.     abor->DrawMode=JAM1;
  85.     abor->Count=5;
  86.     for(i=0; i<20; i++)
  87.     {
  88.         abor->Vectors[i]=0;
  89.         OldV[i]=0;
  90.     }
  91.     if(BType < 2)
  92.     {
  93.         abor->Width=agad->Width+1;
  94.         abor->Height=agad->Height+1;
  95.         if(agad->Flags & GRELWIDTH) abor->Width+=awin->Width;
  96.         if(agad->Flags & GRELHEIGHT) abor->Height+=awin->Height;
  97.     }
  98.     else
  99.     {
  100.         abor->Width=awin->Width-1;
  101.         abor->Height=awin->Height-1;
  102.         abor->LeftEdge=0;
  103.         abor->TopEdge=0;
  104.     }
  105.     abor->Vectors[2]=abor->Width;
  106.     abor->Vectors[4]=abor->Width;
  107.     abor->Vectors[5]=abor->Height;
  108.     abor->Vectors[7]=abor->Height;
  109.     Banz++;
  110.     bnr=Banz;
  111.     return(0);
  112. }
  113. VOID SetBorder(UBYTE m)
  114. {
  115.     abor->LeftEdge=bleft;
  116.     abor->TopEdge=btop;
  117.     abor->FrontPen=bfront;
  118.     abor->BackPen=bback;
  119.     abor->Count=bcount/2;
  120.     if(bdraw==3) bdraw++;
  121.     abor->DrawMode=bdraw;
  122.     if(m > 0 && BType < 2)
  123.     {
  124.         x=agad->Width;
  125.         y=agad->Height;
  126.         if(agad->Flags & GRELWIDTH) x+=awin->Width;
  127.         if(agad->Flags & GRELHEIGHT) y+=awin->Height;
  128.         x1=gwidth;
  129.         y1=gheight;
  130.         TestSize();
  131.     }
  132.     if(m > 0 && BType == 2)
  133.     {
  134.         x=awin->Width;
  135.         y=awin->Height;
  136.         x1=Wwidth;
  137.         y1=Wheight;
  138.         TestSize();
  139.     }
  140.     abor->Width=bwidth;
  141.     abor->Height=bheight;
  142.     if(BType < 2) agad->Border=gborder;
  143.     RetteVectors();
  144.     ok=1;
  145.     status=0;
  146.     SaveOk=1;
  147. }
  148. VOID TestSize()
  149. {
  150.     if(x1 > x) bwidth+=(x1-x);
  151.     if(x1 < x) bwidth-=(x-x1);
  152.     if(y1 > y) bheight+=(y1-y);
  153.     if(y1 < y) bheight-=(y-y1);
  154.     SetVectors();
  155.     RetteVectors();
  156. }
  157. VOID RetteVectors()
  158. {
  159.     for(i=0; i<20; i++)
  160.         abor->Vectors[i]=helpV[i];
  161. }
  162. VOID SetVectors()
  163. {
  164.     for(i=0; i<20; i+=2)
  165.     {
  166.         if((helpV[i]+OldV[i])==abor->Width)
  167.             helpV[i]=bwidth-OldV[i];
  168.         if((helpV[i+1]+OldV[i+1])==abor->Height)
  169.             helpV[i+1]=bheight-OldV[i+1];
  170.     }
  171.     abor->Width=bwidth;
  172.     abor->Height=bheight;
  173. }
  174. VOID DelBorder()
  175. {
  176.     if(BType < 2)
  177.     {
  178.         helpB=agad->GadgetBorder;
  179.         DelBo();
  180.         agad->GadgetBorder=NULL;
  181.         helpB=agad->SelectBorder;
  182.         DelBo();
  183.         agad->SelectBorder=NULL;
  184.         BType=0;
  185.         agad->Border=0;
  186.         firstSB=NULL;
  187.         lastSB=NULL;
  188.     }
  189.     else
  190.     {
  191.         helpB=areq->ReqBorder;
  192.         DelBo();
  193.         areq->ReqBorder=NULL;
  194.     }
  195.     firstGB=NULL;
  196.     lastGB=NULL;
  197.     abor=NULL;
  198. }
  199. VOID DelBo()
  200. {
  201.     while(helpB)
  202.     {
  203.         abor=helpB->NextBorder;
  204.         FreeMem(helpB,sizeof(struct MyBorder));
  205.         helpB=abor;
  206.     }
  207. }
  208. VOID HolBorder()
  209. {
  210.     bnr=0;
  211.     Banz=0;
  212.     if(BType==0)
  213.     {
  214.         firstGB=agad->GadgetBorder;
  215.         abor=firstGB;
  216.         lastGB=NULL;
  217.     }
  218.     if(BType==1)
  219.     {
  220.         firstSB=agad->SelectBorder;
  221.         abor=firstSB;
  222.         lastSB=NULL;
  223.     }
  224.     if(BType==2)
  225.     {
  226.         firstGB=areq->ReqBorder;
  227.         abor=firstGB;
  228.         lastGB=NULL;
  229.     }
  230.     while(abor)
  231.     {
  232.         if(BType==0 || BType==2) lastGB=abor;
  233.         else lastSB=abor;
  234.         bnr++;
  235.         Banz++;
  236.         abor=abor->NextBorder;
  237.     }
  238.     if(BType==0 || BType==2) abor=lastGB;
  239.     else abor=lastSB;
  240. }
  241. USHORT NewBorDef()
  242. {
  243.     USHORT OKB=1;
  244.     status=0;
  245.     ScreenToFront(WMsc);
  246.     BWindow.Screen=WMsc;
  247.     if(!(Gwin=(struct Window *)OpenWindow(&BWindow))) return(1);
  248.     Irp=Gwin->RPort;
  249.     WinBorder(Gwin);
  250.     PrintIText(Irp,&BText[43],0,0);
  251.     SetDrMd(Irp,COMPLEMENT);
  252.     RectFill(Irp,480,100,539,119);
  253.     HolBorder();
  254.     if(abor==NULL)
  255.     {
  256.         if(BType==0) DelGImage();
  257.         if(NewBorder()) return(1);
  258.         status=1;
  259.     }
  260.     SetBDefines();
  261.     if(BType < 2) gborder=agad->Border;
  262.     else gborder=1;
  263.     d=gborder;
  264.     BDef();
  265.     ok=0;
  266.     do
  267.     {
  268.         Wait(1L << Gwin->UserPort->mp_SigBit);
  269.         GetMessage(Gwin);
  270.         switch(class)
  271.         {
  272.             case GADGETUP:
  273.             switch(Id)
  274.             {
  275.                 /* ENDE */
  276.                 case 0: OKB=0;
  277.                     if(bdraw==3) bdraw++;
  278.                     if(ok) OKB=3;
  279.                     if(status)
  280.                     {
  281.                         ClrBorder();
  282.                         OKB=3;
  283.                     }
  284.                     break;
  285.                 /* O K */
  286.                 case 1: if(abor) SetBorder(0);
  287.                     else Error(13,0,1);
  288.                     break;
  289.                 /* LeftEdge */
  290.                 case 2: bleft=LEFTInfo.LongInt;
  291.                     break;
  292.                 /* TopEdge */
  293.                 case 3: btop=TOPInfo.LongInt;
  294.                     break;
  295.                 /* FrontPen */
  296.                 case 4: bfront=FRONTInfo.LongInt;
  297.                     break;
  298.                 /* BackPen */
  299.                 case 5: bback=BACKInfo.LongInt;
  300.                     break;
  301.                 /* Width */
  302.                 case 13: j=WIDTHInfo.LongInt;
  303.                     for(i=0; i<20; i+=2)
  304.                         if((helpV[i]+OldV[i])==bwidth)
  305.                             helpV[i]=j-OldV[i];
  306.                     bwidth=j;
  307.                     BDef();
  308.                     break;
  309.                 /* Height */
  310.                 case 14: j=HEIGHTInfo.LongInt;
  311.                     for(i=0; i<20; i+=2)
  312.                         if((helpV[i+1]+OldV[i+1])==bheight)
  313.                             helpV[i+1]=j-OldV[i+1];
  314.                     bheight=j;
  315.                     BDef();
  316.                     break;
  317.                 /* Neues Border */
  318.                 case 7: if(abor) SetBorder(0);
  319.                     if(Banz<99) {
  320.                     if(NewBorder())
  321.                     {
  322.                         Error(0,0,1);
  323.                         break;
  324.                     }
  325.                     SetBDefines();
  326.                     if(abor->Parent)
  327.                     {
  328.                         bleft=abor->Parent->LeftEdge;
  329.                         btop=abor->Parent->TopEdge;
  330.                         bfront=abor->Parent->FrontPen;
  331.                         bback=abor->Parent->BackPen;
  332.                         bdraw=abor->Parent->DrawMode;
  333.                         bwidth=abor->Parent->Width;
  334.                         bheight=abor->Parent->Height;
  335.                         bcount=abor->Parent->Count*2;
  336.                         if(bdraw==4) bdraw--;
  337.                         for(i=0; i<20; i++)
  338.                             helpV[i]=abor->Parent->Vectors[i];
  339.                         OldVectors();
  340.                     }
  341.                     if(gborder==0) gborder++;
  342.                     status=1;
  343.                     BDef(); }
  344.                     break;
  345.                 /* Border Plus */
  346.                 case 8: if(abor->NextBorder)
  347.                     {
  348.                         SetBorder(0);
  349.                         bnr++;
  350.                         abor=abor->NextBorder;
  351.                         SetBDefines();
  352.                         BDef();
  353.                     }
  354.                     break;
  355.                 /* Border Minus */
  356.                 case 9: if(abor->Parent)
  357.                     {
  358.                         SetBorder(0);
  359.                         bnr--;
  360.                         abor=abor->Parent;
  361.                         SetBDefines();
  362.                         BDef();
  363.                     }
  364.                     break;
  365.                 /* Count Plus */
  366.                 case 18: if(bcount < 20)
  367.                 {
  368.                     bcount+=2;
  369.                     sprintf(GTexte[1],"%0.2d",bcount);
  370.                     BDef();
  371.                     RefreshGadgets(&BVNr,Gwin,NULL);
  372.                 }
  373.                 break;
  374.                 /* Count Minus */
  375.                 case 17: if(bcount > 2)
  376.                 {
  377.                     bcount-=2;
  378.                     sprintf(GTexte[1],"%0.2d",bcount);
  379.                     BDef();
  380.                     RefreshGadgets(&BVNr,Gwin,NULL);
  381.                 }
  382.                 break;
  383.                 /* Border LĂ–SCHEN */
  384.                 case 11: 
  385.                 if(abor)
  386.                 {
  387.                     ClrBorder();
  388.                     if(abor) SetBDefines();
  389.                     BDef();
  390.                     ok=1;
  391.                 }
  392.                 else Error(13,0,0);
  393.                 break;
  394.                 default:
  395.                 if(Id > 19 && Id < 40)
  396.                 {
  397.                     Id-=20;
  398.                     helpV[Id]=VInfo[Id].LongInt;
  399.                     if(Id & 1)
  400.                         OldV[Id]=bheight-helpV[Id];
  401.                     else OldV[Id]=bwidth-helpV[Id];
  402.                 }
  403.                 break;
  404.             } /* switch Id */
  405.             break;
  406.             case GADGETDOWN:
  407.             switch(Id)
  408.             {
  409.                 /* DrawMode */
  410.                 case 6: if(++bdraw == 4) bdraw=0;
  411.                     BText[0].IText=TDMode[bdraw];
  412.                     RefreshGList(&BDraw,Gwin,NULL,1);
  413.                     break;
  414.                 /* Border EIN/AUS */
  415.                 case 12: if(firstGB==NULL)
  416.                     {
  417.                         Error(13,0,0);
  418.                         break;
  419.                     }
  420.                     if(gborder==0)
  421.                     {
  422.                         gborder=d;
  423.                         if(d==0) gborder++;
  424.                         BText[6].IText=GTexte[3];
  425.                     }
  426.                     else
  427.                     {
  428.                         gborder=0;
  429.                         BText[6].IText=GTexte[2];
  430.                     }
  431.                     RefreshGList(&BAus,Gwin,NULL,1);
  432.                     break;
  433.                 /* GadgetRender */
  434.                 case 15: if(BType==1)
  435.                     {
  436.                         if(firstSB) SetBorder(0);
  437.                         BType=0;
  438.                         if(BoWechsel()) OKB=2;
  439.                     }
  440.                     break;
  441.                 /* SelectRender */
  442.                 case 16: if(BType==0 && firstGB != NULL)
  443.                     {
  444.                         SetBorder(0);
  445.                         BType=1;
  446.                         if(BoWechsel()) OKB=2;
  447.                     }
  448.                     break;
  449.                 default: break;
  450.             } /* switch Id */
  451.             break;
  452.         } /* switch class */            
  453.     } while(OKB==1); /* do */
  454.     CloseWindow(Gwin);
  455.     if(OKB==2) Error(0,0,1);
  456.     Work();
  457.     if(gborder==0) DelBorder();
  458.     ScreenToFront(sc);
  459.     if(OKB==3) SetNewWin(1);
  460.     Ready();
  461.     return(0);
  462. }
  463. VOID ClrBorder()
  464. {
  465.     if(abor)
  466.     {
  467.         if(Error(12,0,0))
  468.         {
  469.         if(abor->Parent)
  470.         {
  471.             abor->Parent->NextBorder=abor->NextBorder;
  472.             if(abor->NextBorder)
  473.             {
  474.                 helpB=abor->NextBorder;
  475.                 abor->NextBorder->Parent=abor->Parent;
  476.             }
  477.             else
  478.             {
  479.                 helpB=abor->Parent;
  480.                 if(BType==1) lastSB=helpB;
  481.                 else lastGB=helpB;
  482.                 bnr--;
  483.             }
  484.         }
  485.         else
  486.         {
  487.             if(abor->NextBorder)
  488.             {
  489.                 if(BType==0)
  490.                 {
  491.                     firstGB=abor->NextBorder;
  492.                     helpB=firstGB;
  493.                     agad->GadgetBorder=firstGB;
  494.                 }
  495.                 if(BType==1)
  496.                 {
  497.                     firstSB=abor->NextBorder;
  498.                     helpB=firstSB;
  499.                     agad->SelectBorder=firstSB;
  500.                 }
  501.                 if(BType==2)
  502.                 {
  503.                     firstGB=abor->NextBorder;
  504.                     helpB=firstGB;
  505.                     areq->ReqBorder=firstGB;
  506.                 }
  507.                 abor->NextBorder->Parent=NULL;
  508.             }
  509.             else
  510.             {
  511.                 helpB=NULL;
  512.                 if(BType==0)
  513.                 {
  514.                     firstGB=NULL;
  515.                     lastGB=NULL;
  516.                     agad->GadgetBorder=NULL;
  517.                 }
  518.                 if(BType==1)
  519.                 {
  520.                     firstSB=NULL;
  521.                     lastSB=NULL;
  522.                     agad->SelectBorder=NULL;
  523.                 }
  524.                 if(BType==2)
  525.                 {
  526.                     firstGB=NULL;
  527.                     lastGB=NULL;
  528.                     areq->ReqBorder=NULL;
  529.                 }
  530.             }
  531.         }
  532.         gborder=1;
  533.         if(firstGB==NULL && firstSB==NULL)
  534.             gborder=0;
  535.         ClrWin();
  536.         FreeMem(abor,sizeof(struct MyBorder));
  537.         abor=helpB;
  538.         Banz--;
  539.         }
  540.     }
  541. }
  542. USHORT BoWechsel()
  543. {
  544.     SetPen(Irp,1,COMPLEMENT);
  545.     RectFill(Irp,480,100,539,119);
  546.     RectFill(Irp,480,128,539,147);
  547.     HolBorder();
  548.     i=1;
  549.     if(abor==NULL)
  550.     {
  551.         if(NewBorder())
  552.         {
  553.             Error(0,0,1);
  554.             return(1);
  555.         }
  556.         status=1;
  557.         if(BType==1)
  558.         {
  559.             bleft=lastGB->LeftEdge;
  560.             btop=lastGB->TopEdge;
  561.             bfront=lastGB->FrontPen;
  562.             bback=lastGB->BackPen;
  563.             bdraw=lastGB->DrawMode;
  564.             bwidth=lastGB->Width;
  565.             bheight=lastGB->Height;
  566.             bcount=lastGB->Count*2;
  567.             if(bdraw==4) bdraw--;
  568.             for(j=0; j<20; j++)
  569.                 helpV[i]=lastGB->Vectors[i];
  570.             OldVectors();
  571.             i=0;
  572.         }
  573.     }
  574.     if(agad->Border==0) agad->Border++;
  575.     if(i) SetBDefines();
  576.     BDef();
  577.     ok=1;
  578.     return(0);
  579. }
  580.  
  581. VOID OldVectors()
  582. {
  583.     for(i=0; i<20; i+=2)
  584.     {
  585.         if(helpV[i] >= (bwidth >> 1))
  586.             OldV[i]=bwidth-helpV[i];
  587.         if(helpV[i+1] >= (bheight >> 1))
  588.             OldV[i+1]=bheight-helpV[i+1];
  589.     }
  590. }
  591.